//
//  MPBModel.h
//  用于字典转模型的工具类
//  主要功能包括：通过字典转换成对应的模型
//  转模型过程中可以处理一些个性化需求
//  比如：替换字典 key 值，并与指定的属性名对应
//       默认值处理等
//  效率和内存使用都有良好的表现
//
//

#import <Foundation/Foundation.h>
#import "NSValueTransformer+MPTPredefinedTransformerAdditions.h"
#import "NSValueTransformer+MPTInversionAdditions.h"
#import "MPTValueTransformer.h"

/// 引入封装属性类前声明
@class MPBModelProperty;


/*!
 *
 *  @brief  字典转模型协议
 *
 */
@protocol MPBModelProtocol <NSObject,NSCopying>

/*!
 *
 *  @brief  字典转模型协议方法
 *
 *  @param  dict 转模型的字典
 *
 */
- (void)toSelf:(NSDictionary *)dict;
-(id)initWithDictionary:(NSDictionary*)dict error:(NSError**)err;
+ (NSMutableArray *)instanceArrayWithKeyValuesArray:(id)keyValuesArray;

@optional

/*!
 *
 *  @brief  将属性名换为其他key去字典中取值
 *
 *  @return key 属性名，value 字典中取值用的key
 *
 */
+ (NSDictionary *)JSONKeyPathsByPropertyKey;

/*!
 *
 *  @brief 实现该方法，可以设置不需要赋值的属性
 *
 *  @return 返回需要忽略的属性
 */
- (NSSet *)ignoreProperties;        

/*!
 *  
 *  @brief 实现该方法，当返回YES时，可以忽略字典中不包含，但是模型中有的属性的值。NO和不实现效果一致，默认不忽略
 *
 */
- (BOOL)ignoreKeysNotContainInDict;

@end

/*!
 *
 *  @brief  字典转模型工具类
 *
 */
@interface MPBModel : NSObject <MPBModelProtocol,NSCopying>

@property (nonatomic, copy, readonly) NSDictionary *dictionaryValue;

+ (NSMutableArray *)propertyKeys;
- (BOOL)isEqual:(id)object;
- (NSString *)description;


@end

